#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/12/28 10:12
# @Author  : Michael Yu
# @Desc    : 图片压缩处理

import os
import os.path
from PIL import Image

'''
图片压缩处理
参考：http://blog.csdn.net/jy_95/article/details/52041718
http://m.blog.csdn.net/c_boy_lu/article/details/49666409
'''

# 要处理的文件根目录
ImageFilePath = "E:\\image2"

'''
扫描对应目录下的文件路径将其存入到数组中
'''
def getFilesAbsolutelyPath(ImageFilePath):
    currentfiles = os.listdir(ImageFilePath)
    filesVector = []
    for file_name in currentfiles:
        fullPath = os.path.join(ImageFilePath, file_name)
        if os.path.isdir(fullPath):
            newfiles = getFilesAbsolutelyPath(fullPath)
            filesVector.extend(newfiles)
        else:
            filesVector.append(fullPath)
    return filesVector


filePathVector = getFilesAbsolutelyPath(ImageFilePath)

#要处理的文件
pngFile = []

'''
关于mode，PIL官网上这么写的：
1 (1-bit pixels, black and white, stored with one pixel per byte)  
L (8-bit pixels, black and white)  
P (8-bit pixels, mapped to any other mode using a colour palette)  
RGB (3x8-bit pixels, true colour)  
RGBA (4x8-bit pixels, true colour with transparency mask)  
CMYK (4x8-bit pixels, colour separation)  
YCbCr (3x8-bit pixels, colour video format)  
I (32-bit signed integer pixels)  
F (32-bit floating point pixels  

我们从美术那里得到的原始的png图片为32bit的RGBA图片，含有Alpha通道掩码值，经pngquant压缩后成为8bit的P图片，
P表示的是，8位像素，用到调色板因此可以映射到其他任意的mode，所以此时它类似于一个查色表，可以映射到其他任意模式。
'''
#过滤出png的文件
for filename in filePathVector:
    flag = filename.find(".png")
    if flag != -1:
        im = Image.open(filename)
        if im.mode != "P":
            pngFile.append(filename)
            #print(mode)


#将已处理的文件名称写入到文件
finishList = ImageFilePath + '/finish_list.txt'
if os.access(finishList, os.F_OK):
    print('删除旧的清单，生成一个空的清单')
txtFile = open(finishList, 'w', encoding='utf-8')
#清空文件内容
txtFile.truncate()

print('===> 待转换的文件数量%d：' %len(pngFile))
#计数
cnt = 1;

# pngquant.exe path
pngquantPath = "E:\python\saomaqingdao\pngquanti.exe -f --ext .png --quality 30-30 "
# get .Png File Name
for filename in pngFile:
    #os.popen(cmd)
    os.system(pngquantPath + filename)
    print('已处理了 %d 个文件，当前文件为: %s ' %(cnt,filename))
    cnt = cnt + 1
    txtFile.writelines(filename+'\n')